# kind: Template

Конфигурация предназначена для реализации шаблона мутации ресурса в кластере. Главным полем является "data", в котором описаны те поля изменяемого ресурса, которые будут подвержены мутации, а так же правила, описывающие результат мутации.

Перед началом реализации необходимо ознакомиться с ограничениями по мутации, которые описываются в рамках конфигурации «kind: Scope»

Мутация (полная или частичная) соответствует полю ["updateStrategy"](./trigger.md#mutationconfigs) в шаблоне «kind: Trigger» (replace или merge)


| Поле       | Назначение               |
|------------|--------------------------|
| [data](#data)       | Описание полей ресурса для мутирования |
| [location](#location)   | Путь, по которому можно указать необходимые секции ресурса для измененния по шаблону из поля "data"  |


## data

Это поле позволяет описать секции ресурса, которые будут мутированы. Есть возможность использовать goTemplate аналогично синтаксису в helm. 

Примеры:




## location

Это поле позволяет обозначить путь до тех секций ресурса, которые требуют изменения по шаблону. Также location поддерживает добавление фильтра

1. [? @.\<key>==\<value>] (поле key в рамках объекта в массиве должно иметь значение value)
2. [@.\<key>] (существование поля key в рамках объекта в массиве)
3. [] (эквалентно * все значения)

<br>
Пример конфигурации замены контейнера для логики replace:

```yaml
apiVersion: some-version
kind: Template
metadata:
  name: locate-mutation
spec:
  # при таком значении location произведется замена контейнера hello
  location: 'spec.template.spec.containers[? @.name == `hello`]'
  # политика на триггере replace ведется полная замена значений в секции из location
  data: |-
    name: hello
    image: busybox:1.28
    env:
      - name: POD_NAME_NEW
        valueFrom:
          fieldRef:
            apiVersion: v1
            fieldPath: metadata.name
      - name: NAMESPACE_NEW
        valueFrom:
          fieldRef:
            apiVersion: v1
            fieldPath: metadata.namespace
    command:
      - 'sh'
      - '-c'
      - 'echo "Hello, Kubelatte!" && sleep 100'
```

Изменение ресурса после мутации:

<table>
<tr>
<td> До </td> <td> После </td>
</tr>
<tr>
<td> 

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80
        - name: hello
          image: busybox:1.21
          env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
          command:
            - 'sh'
            - '-c'
            - 'echo "Hello, Kubernetes!" && sleep 3600'
      restartPolicy: OnFailure
```

 </td>
<td>

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.14.2
          ports:
            - containerPort: 80
        - name: hello
          image: busybox:1.28
          env:
            - name: POD_NAME_NEW
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.name
            - name: NAMESPACE_NEW
              valueFrom:
                fieldRef:
                  apiVersion: v1
                  fieldPath: metadata.namespace
           command:
             - 'sh'
             - '-c'
             - 'echo "Hello, Kubelatte!" && sleep 100'
      restartPolicy: OnFailure
```

</td>
</tr>
</table>

Пример замены значения произвольного поля:
```yaml
apiVersion: some-version
kind: Template
metadata:
  name: locate-mutation
spec:
  # при таком значении location произведется замена значения секции "command" в рамках контейнера с названием "hello")
  location: 'spec.template.spec.containers[? @.name == `hello`].command'
  # при политике на триггере replace ведется полная замена значений в секции из location
  data: |-
    - 'latte'
    - 'is'
    - 'the best'
```

Пример замены множественного значения поля:
```yaml
apiVersion: some-version
kind: Template
metadata:
  name: locate-mutation
spec:
  # при таком значении location произведется замена значения секции command в рамках всех контейнеров
  location: 'spec.template.spec.containers[].command'
  # при политике на триггере replace ведется полная замена значений в секции из location
  data: |-
    - 'latte'
    - 'is'
    - 'the best'
```